import java.util.Objects;

/**
 * 认证信息记录类，用于封装用户认证相关信息
 * 使用Java record类型实现，自动生成构造方法、getter、equals、hashCode和toString方法
 */
public record AuthInfo(String userId, String username) {
    /**
     * 认证信息请求头名称常量
     */
    public static final String AUTH_INFO_HEADER_KEY = "x-auth-info";
    /**
     * 空认证信息实例，表示匿名用户
     */
    public static final AuthInfo EMPTY = AuthInfo.of("0", "匿名用户");
    /**
     * 线程本地变量，用于存储当前线程的认证信息
     */
    private static final ThreadLocal<AuthInfo> INFO_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 创建认证信息实例的工厂方法
     * @param userId 用户ID
     * @param userName 用户名
     * @return 新的AuthInfo实例
     */
    public static AuthInfo of(String userId, String userName) {
        return new AuthInfo(userId, userName);
    }

    /**
     * 获取当前线程的认证信息
     * @return 当前线程的认证信息，如果不存在则返回空认证信息
     */
    public static AuthInfo current() {
        AuthInfo ai = INFO_THREAD_LOCAL.get();
        return ai != null ? ai : EMPTY;
    }

    /**
     * 设置当前线程的认证信息
     * @param info 要设置的认证信息，不能为null
     * @throws NullPointerException 如果传入的认证信息为null
     */
    public static void setCurrent(AuthInfo info) {
        Objects.requireNonNull(info, "用户认证信息不可为空");
        INFO_THREAD_LOCAL.set(info);
    }

    /**
     * 清除当前线程的认证信息
     */
    public static void clear() {
        INFO_THREAD_LOCAL.remove();
    }
}
